package test.msm;

import java.util.HashMap;
import java.util.Map;

import hyl.core.MyFun;
import hyl.core.db.MyDB;
import hyl.ext.base.MySession;
import hyl.ext.base.SessionFactory;
import hyl.ext.web.ms.ABOpen;
import hyl.ext.web.ms.BInfo;

import hyl.ext.web.ms.TMsA;
import hyl.ext.web.ms.TMsB;

/*方法4:
 * 
 * a 发送 登录b请求 参数:(userid,tokena)
 * 
 * b 创建tokenb(携带 userid) 加密应答 参数(tokena,tokenb,重定向地址b.url2,b.key)
 * 
 * a 解密应答 验证key 如果正确 重定向到 b.url?token=tokenb&url=url2
 * 
 * b 获取tokenb 取出userid 创建session 定位到 b.url2
 */

public class testsso4 {
	public static void main(String[] args) {
		testsso4 tt2 = new testsso4();
		MySession sessiona = SessionFactory.getSession(null, null);
		tt2.f4_1_a(sessiona);

	}

	TMsA _ma = new TMsA();
	TMsB _mb;


	Map<String, String> _apps = new HashMap<>();
	SessionFactory _sf;

	public testsso4() {
		_sf = SessionFactory.getInstance();
		_apps.put("123", "123456");
		_ma.setDB("db2");
		_ma.init();
		_mb = new TMsB();
	}
	public void getBOpen () {
		
	}
	/*
	 * 这是一个新弹出的页面,目前session 是 A的 但是马上要重定向到B去
	 * 
	 */
	public void f4_1_a(MySession sessiona) {
		String appidB = "123";
		boolean online = _ma.isBappOnline(appidB);
		// 不在线 退出
		if (!online)
			return;

		// 如果 appidb 不在白名单 不允许访问
		String sessip = sessiona.getIp();
		// 登录a之后 session_a ->userid_a-> appid_b -> userid_b and sessionid_b
		//如果没有 说明用户没有 在A,B都注册账号
		ABOpen opena = _ma.getABOpen1(sessiona.getUserId(),appidB);
		if (opena==null) return;
				
		String tempkey = MyFun.getMsDesc();
		String 明文 = MyFun.join2(",", appidB, opena.uidB, opena.sidB, tempkey, sessip);
		BInfo mi = _ma.getBInfo(appidB);
		String mm = mi.aes加密64(明文);
		// 有sessionid_b 通过前端直接访问,也会因为ip 不一样 导致无法登录
		// 如果sessionid_b 为空或不正确 让b创建一个新的 sessionid_b
		f4_2_b(mm, tempkey);
	}

	/*
	 */
	public void f4_2_b(String 密文, String key) {
		// 先验证签名再解码 ,否则每个都解码 遇到暴力攻击非常麻烦
		String us_st = _mb._binfo.aes解密64(密文);
		MyFun.print("mm", us_st);
		String[] mms = us_st.split(",");
		String appid_b = mms[0];
		String userid_b = mms[1];
		String session_b = mms[2];
		String key_a = mms[3];
		String userip = mms[4];
		// 如果令牌不对,说明密文不对 阻止登录
		if (MyFun.isBlank(key_a) || MyFun.isBlank(key) || !key.equals(key_a))
			return;
		// 如果 appid 不一致 阻止登录
		if (MyFun.isBlank(appid_b) || !appid_b.equals(_mb._binfo.getAppid()))
			return;

		MySession msession = SessionFactory.getSessionById(session_b);
		if (msession == null) {
			if (MyFun.isBlank(userid_b) || MyFun.isBlank(userip))
				return;
			//msession = SessionFactory.getSsoSession(userid_b, userip);

		}
		if (msession == null)
			return;
		String 重定向burl = "";
		//消除 tokana
	}

}
